昨天講完基本的概念,今天就讓我們來建構基礎的 CI / CD 環境~
今天預計會建立 gitea
與 drone
這兩個工具,gitea
負責作為版本控制,而 drone
則是用來做 CI/CD
此次範例會使用到 docker
與 docker-compose
,如果沒有安裝的朋友可以參考 這裡
如果還沒有安裝的朋友可以參考一下連結
在 mariadb 內要建立兩個 db
分別為 gitea
與 drone
,可以透過以下指令
mysql -u <username> -p -h <ip> -e "create database gitea"
mysql -u <username> -p -h <ip> -e "create database drone"
drone 是使用 golang
開發的 CI/CD
工具,最大的特點在於裡面進行的所有步驟都是 container base
的,因此每次執行時環境都是最乾淨的狀態。
provider 在 drone 裡的定義就是 source code
的來源,目前支援以下幾個
runner 為實際執行腳本的 container
,由於 drone 是分散式的架構,因此 runner 可以安裝在不同的機器上。
目前支援以下 runner
將每一步都分成不同的 container
來運行
將每一步都起不同的 pod
來運行
不適用於 container 的專案使用此 runner
透過 ssh
連線至遠端執行
drone 使用 .drone.yml
來設定 CI/CD
的觸發條件與流程,也因為這個檔案是放在專案內的,因此可以跟著專案的版本進行修改,也就是可以加入版本控制。
這邊我們通過 docker-compose
來啟動 drone
,首先建立一個名為 docker-compose.yml
的檔案並且輸入以下內容
version: "3.4"
安裝的部分會分成兩塊
gitea 的建立可以參考官方文件,在這裡面我們設定好 db
的相關連線,並且透過 volumes
將 container 內部的資料存放至外部作為持久化儲存。
gitea:
image: gitea/gitea:latest
environment:
- USER_UID=1000
- USER_GID=1000
- ROOT_URL=http://<ip>:8888
- DB_TYPE=mysql
- DB_HOST=<ip>:3306
- DB_NAME=gitea
- DB_USER=<資料庫帳號>
- DB_PASSWD=<資料庫密碼>
restart: always
volumes:
- /etc/timezone:/etc/timezone:ro
- /etc/localtime:/etc/localtime:ro
- .gitea:/data
ports:
- "8888:3000"
- "222:22"
server 的部分參考了 官方文件,對外設定成 8000
port,因為是結合 gitea
,因此環境變數的部分都是採用 DRONE_GITEA_*
的參數,資料庫的部分用 mysql
drone-server:
image: drone/drone:1
ports:
- 8000:80
volumes:
- /drone:/var/lib/drone/
restart: always
depends_on:
- gitea
environment:
- DRONE_GIT_ALWAYS_AUTH=false
- DRONE_SERVER_HOST=${DRONE_SERVER_HOST}
- DRONE_SERVER_PROTO=${DRONE_SERVER_PROTO}
- DRONE_GITEA_SERVER=0.4
- DRONE_GITEA_CLIENT_ID=${DRONE_GITEA_CLIENT_ID}
- DRONE_GITEA_CLIENT_SECRET=${DRONE_GITEA_CLIENT_SECRET}
- DRONE_RPC_SECRET=${DRONE_RPC_SECRET}
- DRONE_AGENTS_ENABLED=true
- DRONE_LOGS_PRETTY=true
- DRONE_LOGS_COLOR=true
- DRONE_DATABASE_DRIVER=mysql
- DRONE_DATABASE_DATASOURCE=<資料庫使用者>:<資料庫密碼>@tcp(<ip>:3306)/drone?parseTime=true
在以上的設定中可以看到,我們將部分的參數挖空成 ${}
,這邊使用 .env
來儲存變數,因此可以建立 .env
檔案後加入以下內容
DRONE_SERVER_HOST=<ip>:8000
DRONE_SERVER_PROTO=http
DRONE_GITEA_SERVER=http://<ip>:8888/
DRONE_GITEA_CLIENT_ID=
DRONE_GITEA_CLIENT_SECRET=
DRONE_RPC_SECRET=test1234
關於 gitea 的 client id
與 client secret
的部分明天再來說明怎麼建立
runnser 的部分就相對單純,將外部的 docker.sock
mount 到 container 內部,由於 runnser 與 server 之間是使用 grpc
來溝通,因此要設定好相關的變數
drone-agent:
image: drone/agent:1
restart: always
depends_on:
- drone-server
volumes:
- /var/run/docker.sock:/var/run/docker.sock
environment:
- DRONE_RPC_SERVER=http://drone-server
- DRONE_RPC_SECRET=${DRONE_RPC_SECRET}
- DRONE_RUNNER_CAPACITY=3
我們可以通過 docker-compose up -d
的方式進行啟動,啟動過程如下
Starting drone_gitea_1 ... done
Starting drone_drone-server_1 ... done
Starting drone_drone-runner_1 ... done
透過瀏覽器開啟 http://0.0.0.0:8888/install
後可以看到 gitea
的設定畫面如下
什麼都不用修改就可以直接移動到最下方點選「安裝 gitea」,安裝完成後可以看到以下畫面
按照自己的喜好註冊一組帳號即可
drone 的部分現階段還看不到畫面,原因是還沒有設定 gitea
的 client
與 secret
,這部分明天會多加說明~